+2005-08-29 Øyvind Kolås <pippin@gimp.org>
+
+ * babl/babl-db.h: Do nor warn about collision during db_insert
+ * babl/babl-extension.[ch]: Implemented fs traversal based on BABL_PATH.
+ added babl_set_extender to API.
+ * babl/babl-instance.h: Changed signature of type_name##_new.
+ * babl/babl-introspect.c: (babl_introspect): use new babl_extender
+
2005-08-29 Øyvind Kolås <pippin@gimp.org>
* babl/babl-internal.c: (babl_internal_init): set memory functions.
if (collision)
{
+#if 0
if (!strcmp (collision->instance.name, babl->instance.name) )
babl_log ("conflicting name:\n\t\tnew: '%s'\n\t\texisting '%s' from %s",
babl->instance.name, collision->instance.name,
- BABL(collision->instance.creator)->instance.name);
+ collision->instance.creator?BABL(collision->instance.creator)->instance.name:"core");
else if (collision->instance.id == babl->instance.id)
babl_log ("conflicting id:\n\t\tnew: '%s' (id=%i)\n\t\texisting '%s' from %s",
babl->instance.name, babl->instance.id, collision->instance.name,
- BABL(collision->instance.creator)->instance.name);
+ collision->instance.creator?BABL(collision->instance.creator)->instance.name:"core");
+#endif
return collision;
}
* Boston, MA 02111-1307, USA.
*/
+#define BABL_PATH "/usr/lib/babl:/usr/local/lib/babl:~/.babl";
+#define BABL_PATH_SEPERATOR "/"
+#define BABL_LIST_SEPERATOR ':'
+
+
#define BABL_DYNAMIC_EXTENSIONS
#define BABL_INIT_HOOK init_hook();
static int each_babl_extension_destroy (Babl *babl, void *data);
-Babl *babl_extension_current_extender = NULL;
+static Babl *babl_extension_current_extender = NULL;
Babl *
babl_extender (void)
return NULL;
}
-static void
+void
babl_set_extender (Babl *new_extender)
{
babl_extension_current_extender = new_extender;
#define RTLD_NOW 0
#endif
-
static Babl *
load_failed (Babl *babl)
{
int (*init) (void) = NULL;
void (*destroy) (void) = NULL;
-
dl_handle = dlopen (path, RTLD_NOW);
if (!dl_handle)
{
return load_failed (babl);
}
-
if (db_insert (babl) == babl)
{
babl_set_extender (NULL);
}
}
+static void
+babl_extension_load_dir (const char *base_path)
+{
+ DIR *dir;
+
+ if ((dir = opendir (base_path)))
+ {
+ struct dirent *dentry;
+
+ while ((dentry = readdir (dir)) != NULL)
+ {
+ if (dentry->d_name[0] != '.' &&
+ dentry->d_ino > 0)
+ {
+ char *path = NULL;
+ struct stat st;
+ char *extension;
+
+ path = babl_strcat (path, base_path);
+ path = babl_strcat (path, BABL_PATH_SEPERATOR);
+ path = babl_strcat (path, dentry->d_name);
+
+ stat (path, &st);
+
+ if ((extension = strrchr (dentry->d_name, '.')) !=NULL &&
+ !strcmp (extension, ".so"))
+ {
+ babl_extension_load (path);
+ }
+
+ babl_free (path);
+ }
+
+ }
+ }
+}
+
+static const char *
+babl_dir_list (void)
+{
+ const char *ret;
+
+ ret = getenv ("BABL_PATH");
+ if (!ret)
+ ret = BABL_PATH;
+ return ret;
+}
+
+
+static char *
+expand_path (char *path)
+{
+ char *src;
+ char *dst;
+
+ dst = NULL;
+
+ src=path;
+
+ while(*src)
+ {
+ switch (*src)
+ {
+ case '~':
+ dst = babl_strcat (dst, getenv ("HOME"));
+ break;
+ default:
+ {
+ char tmp[2]="?";
+ tmp[0]=*src;
+ dst = babl_strcat (dst, tmp);
+ }
+ }
+ src++;
+ }
+ return dst;
+}
+
+
+/* parse the provided colon seperated list of paths to search
+ */
+static void
+babl_extension_load_dir_list (const char *dir_list)
+{
+ int eos = 0;
+ const char *src;
+ char *path, *dst;
+
+
+ path = babl_strdup (dir_list);
+ src = dir_list;
+ dst = path;
+
+ while (!eos)
+ {
+ switch (*src)
+ {
+ case '\0':
+ eos=1;
+ case BABL_LIST_SEPERATOR:
+ {
+ char *expanded_path = expand_path (path);
+ babl_extension_load_dir (expanded_path);
+ babl_free (expanded_path);
+ }
+ dst=path;
+ src++;
+ *dst = '\0';
+ break;
+ default:
+ *(dst++) = *(src++);
+ *dst = '\0';
+ break;
+ }
+ }
+ babl_free (path);
+}
+
static void
dynamic_init_hook (void)
{
- babl_extension_load ("/home/pippin/.babl/naive-CMYK.so");
- babl_extension_load ("/home/pippin/.babl/CIE-Lab.so");
+ babl_extension_load_dir_list (babl_dir_list ());
}
#endif
return 0; /* continue iterating */
}
-
BABL_CLASS_TEMPLATE (babl_extension)
void *user_data);
#endif
-extern Babl *babl_extension_current_extender;
void
babl_introspect (Babl *babl)
{
#ifdef BABL_LOG
- Babl *extender_backup = babl_extension_current_extender;
+ Babl *extender_backup = babl_extender ();
- babl_extension_current_extender = babl_extension_quiet_log();
+ babl_set_extender (babl_extension_quiet_log());
if (babl)
{
babl_fish_each (each_introspect, NULL);
babl_log ("");
- babl_extension_current_extender = extender_backup;
+ babl_set_extender (extender_backup);
#endif
}